package nl.hu.vakantievibes.client;

import java.util.Date;

import nl.hu.vakantievibes.domain.Gebruiker;
import nl.hu.vakantievibes.domain.Reis;
import nl.hu.vakantievibes.ui.NotificationManager;

import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.user.client.History;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Anchor;
import com.google.gwt.user.client.ui.RootPanel;
import com.google.gwt.user.client.ui.SuggestBox;
import com.google.gwt.user.client.ui.TextArea;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.Widget;

public class FieldVerifier {

	private static FieldVerifier fv;
	
	private FieldVerifier(){ }
	
	public static FieldVerifier get() {
		if(fv == null) {
			fv = new FieldVerifier();
		}
		return fv;
	}
	
	public void checkRegister(final String gN, final String ww){
		AsyncCallback<java.lang.Boolean> callback = new AsyncCallback<java.lang.Boolean>() {
			@Override
			public void onFailure(Throwable caught) {
				NotificationManager.get().createNotification("Er is een server fout opgetreden. Excuses voor het ongemak.");
			}
			@Override
			public void onSuccess(java.lang.Boolean result) {
				if(result) {
					NotificationManager.get().createNotification("U bent succesvol geregistreerd met gebruikersnaam: " + gN + ".");
					History.newItem("login");
				} else {
					NotificationManager.get().createNotification("De door u ingestuurde gebruiker bestaat al.");
				}
			}
		};
		new ServerCall().registerUser(gN, ww, callback);
	}
	
	public void checkLogin(final TextBox gN, final TextBox ww){
		AsyncCallback<Gebruiker> callback = new AsyncCallback<Gebruiker>() {
			@Override
			public void onFailure(Throwable caught) {
				NotificationManager.get().createNotification("Er is een server fout opgetreden. Excuses voor het ongemak.");
			}
			@Override
			public void onSuccess(Gebruiker result) {
				if(result == null) {
						NotificationManager.get().createNotification("Uw gebruikersnaam/wachtwoord combinatie is niet bij ons bekend.");
						gN.setStyleName(""); ww.setStyleName("");
						ww.setText("");						
				} else {
					NotificationManager.get().createNotification("Welkom " + result.getGebruikersNaam() + "! U bent succesvol ingelogd.");
					Systeem.get().setGebruiker(result);
					History.newItem("allereizen");					
					RootPanel rp = RootPanel.get("loginlinks");
					rp.clear();
					Anchor a = new Anchor("Logout");
					a.addClickHandler(new ClickHandler() {	
						@Override
						public void onClick(ClickEvent event) {
							Systeem.get().logout();
						}
					});
					rp.add(a);
					Systeem.get().createNavigation();
				}
			}
		};
		new ServerCall().processLogin(gN.getText(), ww.getText(), callback);
	}
	
	public void addReis(String nm, String ld, String ps, double prs, Date vdtm, Date adtm, String oms) {
		AsyncCallback<Boolean> callback = new AsyncCallback<Boolean>() {
			@Override
			public void onFailure(Throwable caught) {
				NotificationManager.get().createNotification("Er is een fout opgetreden, de reis is niet toegevoegd.");
			}
			@Override
			public void onSuccess(Boolean result) {
				if(result == false) {
					NotificationManager.get().createNotification("Er is een fout opgetreden, de reis is niet toegevoegd.");	
				} else {
					NotificationManager.get().createNotification("De reis is succesvol toegevoegd.");
					History.newItem("allereizen");
				}
			}
		};
		new ServerCall().addReis(nm, ld, ps, prs, vdtm, adtm, oms, callback);
	}
	
	public void addBoeking(Reis r, String nm, String tus, String an, String strn,
			String hn, String wp, String pc, String em, int tel, int dag, int maand, int jaar,
			boolean a, boolean f, int zPl, int fPl) {
		AsyncCallback<Boolean> callback = new AsyncCallback<Boolean>() {
			@Override
			public void onFailure(Throwable caught) {
				NotificationManager.get().createNotification("Er is een fout opgetreden, de reis is niet geboekt.");
			}
			@Override
			public void onSuccess(Boolean result) {
				if(result == false) {
					NotificationManager.get().createNotification("Er is een fout opgetreden, de reis is niet geboekt.");	
				} else {
					NotificationManager.get().createNotification("De reis is succesvol geboekt.");
					History.newItem("allereizen");
				}
			}
		};
		new ServerCall().addBoeking(r, Systeem.get().getGebruiker(), nm, tus, an, strn, hn, wp, pc, em, tel, dag, maand, jaar, a, f, zPl, fPl, callback);
	}
	public boolean checkField(String text, int minLength, int maxLength) {
		if(text.length() >= minLength && text.length() <= maxLength) {
			return true;
		} else {
			return false;
		}	
	}
	
	public void checkField(Widget w) {
		if(w instanceof TextBox) {
			if(FieldVerifier.get().checkField(((TextBox) w).getText(), 4, 30)) { 
				w.setStyleName("green-border");
			} else {
				w.setStyleName("red-border");
			}
		} else if(w instanceof SuggestBox) { 
			if(FieldVerifier.get().checkField(((SuggestBox) w).getText(), 4, 30)) { 
				w.setStyleName("green-border");
			} else {
				w.setStyleName("red-border");
			}
		} else if(w instanceof TextArea) {
			if(FieldVerifier.get().checkField(((TextArea) w).getText(), 4, 500)) { 
				w.setStyleName("green-border");
			} else {
				w.setStyleName("red-border");
			}
		}
	}
	
}
